# TeleWarny Telegram Bot v1.7 PRE-RELEASE

import telebot, sys, os, datetime, time, qrcode, random, wikipedia as wiki, re, pyowm, cv2, requests
from config import *
from thisapidoesnotexist import get_cat
from telebot import types
from pyowm import OWM
from pyowm.utils import config
from pyowm.utils import timestamps

os.system('clear')

charsForRandGen = '@!?#abcdefghijklnopqrstuvwxyzABCDEFGHIJKLNOPQRSTUVWXYZ0987654321'
charsForPassw = '#!?&-=+_abcdefghijklnopqrstuvwxyzABCDEFGHIJKLNOPQRSTUVWXYZ0987654321'

owm = OWM(OWM_TOKEN)
mgr = owm.weather_manager()

print("\n ===== HOST CONSOLE =====")
print("\n "+NAME+" "+VER+"")

wiki.set_lang('ru')

def getWikiSWE(sent):
	return re.sub(r'\(.*?\)\«\»\'','',sent)

def getWiki(sent):
	try:
		words = sent.split()
		data = []
		for i in words:
			if i not in ['что','кто','где','когда','такой','такая','такое','такие']:
				data.append(i)
		mainSent = ' '.join(data)
		wikisent = getWikiSWE(wiki.summary(mainSent, sentences = random.randint(3,5)))
		return wikisent
	except wiki.exceptions.PageError:
		wikiErrOut = '1'
		return wikiErrOut
	except:
		wikiErrOut = '2'
		return wikiErrOut

def helloMsg():
	ntime = datetime.datetime.now()
	if ntime.hour >= 22 or ntime.hour == 0 or ntime.hour == 1 or ntime.hour == 2 or ntime.hour == 3:
		rndAns = random.randint(1, 7)
		if rndAns == 1:
			msg = "Доброй ночи, рад вас видеть"
		elif rndAns == 2:
			msg = "Доброй ночи"
		elif rndAns == 3:
			msg = "Рад снова вас видеть"
		elif rndAns == 4:
			msg = "Здравствуйте"
		elif rndAns == 5:
			msg = "Рад встречи"
		elif rndAns == 6:
			msg = "Привет"
		elif rndAns == 7:
			msg = "Доброй ночи, я из Сочи"
	elif ntime.hour >= 18:
		rndAns = random.randint(1, 8)
		if rndAns == 1:
			msg = "Добрый вечер, я диспетчер"
		elif rndAns == 2:
			msg = "Добрый вечер, рад вас видеть"
		elif rndAns == 3:
			msg = "Добрый вечер"
		elif rndAns == 4:
			msg = "Здравствуйте"
		elif rndAns == 5:
			msg = "Рад встречи"
		elif rndAns == 6:
			msg = "Привет"
		elif rndAns == 7:
			msg = "Вечер добрый"
		elif rndAns == 8:
			msg = "Рад снова вас видеть"
	elif ntime.hour >= 12:
		rndAns = random.randint(1, 7)
		if rndAns == 1:
			msg = "Добрый день"
		elif rndAns == 2:
			msg = "Добрый день, рад вас видеть"
		elif rndAns == 3:
			msg = "День добрый"
		elif rndAns == 4:
			msg = "Здравствуйте"
		elif rndAns == 5:
			msg = "Рад встречи"
		elif rndAns == 6:
			msg = "Привет"
		elif rndAns == 7:
			msg = "Рад снова вас видеть"
	elif ntime.hour >= 4:
		rndAns = random.randint(1, 6)
		if rndAns == 1:
			msg = "Доброе утро"
		elif rndAns == 2:
			msg = "Доброе утро, рад вас видеть"
		elif rndAns == 3:
			msg = "Здравствуйте"
		elif rndAns == 4:
			msg = "Рад встречи"
		elif rndAns == 5:
			msg = "Привет"
		elif rndAns == 6:
			msg = "Рад снова вас видеть"
	return msg

bot = telebot.TeleBot(TOKEN)
print("\n < BOT STARTED >\n")

# Приветсвие
@bot.message_handler(commands=['start'])
def welcome(message):
	with open("banners/"+str(random.randint(1,36))+".jpg", "rb") as banner:
		bot.send_photo(message.chat.id, banner)

	# Клавиатура
	keybd = types.ReplyKeyboardMarkup(resize_keyboard=True)
	keybd.add(types.KeyboardButton("Привет ✋"), types.KeyboardButton("Рандомное число 🎲"),
		types.KeyboardButton("Орёл или Решка 🦅"), types.KeyboardButton("Сгенерируй кота 🐱"),
		types.KeyboardButton("Сгенерируй QR код 💻"), types.KeyboardButton("Сгенерируй пароль 🔑"),
		types.KeyboardButton("Ищи в Википедии 🔍"), types.KeyboardButton("Узнай погоду 🌧"),
		types.KeyboardButton("Сколько время ⏱"), types.KeyboardButton("Просканируй QR код 💻"),
		types.KeyboardButton("Предложить идею для новой функции ✉️"))

	bot.send_message(message.chat.id, helloMsg()+", <b>"+message.from_user.first_name+"</b>\nЯ <b>"+NAME+" "+VER+"</b>\n\n<a href=\"https://notabug.org/SaintScript/TeleWarny_Source_Code\">Исходный код</a>", parse_mode='html', reply_markup=keybd)

# Команды
@bot.message_handler(content_types=['text'])
def command(message):
	if 'Привет ✋' == message.text:
		bot.send_message(message.chat.id, helloMsg())
	elif 'Рандомное число 🎲' == message.text:
		bot.send_message(message.chat.id, "Получилось <b>"+str(random.randint(1,100))+"</b>", parse_mode='html')
	elif 'Орёл или Решка 🦅' == message.text:
		bot.send_message(message.chat.id, "Выпало <b>"+random.choice(["Орёл","Решка"])+"</b>", parse_mode='html')
	elif 'Сгенерируй кота 🐱' == message.text:
		rndAns = random.randint(1,6)
		if rndAns == 1:
			bot.send_message(message.chat.id, "Подождите...")
		elif rndAns == 2:
			bot.send_message(message.chat.id, "Секунду...")
		elif rndAns == 3:
			bot.send_message(message.chat.id, "Минутку...")
		elif rndAns == 4:
			bot.send_message(message.chat.id, "Подождите, мы пока генерируем вашего котика...")
		elif rndAns == 5:
			bot.send_message(message.chat.id, "Пожалуйста подождите...")
		elif rndAns == 6:
			bot.send_message(message.chat.id, "Секундочку, и ваше чудо будет готово...")
		time.sleep(random.randint(0,3))
		rcfn = ''
		for i in range(random.randint(7,10)):
			rcfn += random.choice(charsForRandGen)
		cat = get_cat()
		ntime = datetime.datetime.now()
		catSaveAs = str(ntime.hour)+":"+str(ntime.minute)+":"+str(ntime.second)+"-"+rcfn+"_twGenCat.jpeg"
		cat.save_image(catSaveAs)
		with open(catSaveAs, "rb") as img:
			bot.send_photo(message.chat.id, img)
		time.sleep(1)
		os.system("shred -n 36 -u -z "+catSaveAs)
	elif 'Сгенерируй QR код 💻' == message.text:
		Msg = bot.send_message(message.chat.id, "<b>Введите данные для QR кода</b>", parse_mode='html')
		bot.register_next_step_handler(Msg, genQRC)
	elif 'Сгенерируй пароль 🔑' == message.text:
		passw = ''
		for i in range(random.randint(16,32)):
			passw += random.choice(charsForPassw)
		bot.send_message(message.chat.id, "Вот ваш пароль: <b>"+passw+"</b>", parse_mode='html')
	elif 'Ищи в Википедии 🔍' == message.text:
		Msg = bot.send_message(message.chat.id, "<b>Введите запрос</b>", parse_mode='html')
		bot.register_next_step_handler(Msg, wikiSearch)
	elif 'Узнай погоду 🌧' == message.text:
		Msg = bot.send_message(message.chat.id, "<b>Введите город или край</b>", parse_mode='html')
		bot.register_next_step_handler(Msg, weather)
	elif 'Сколько время ⏱' == message.text:
		ntime = datetime.datetime.now()
		bot.send_message(message.chat.id, "Сейчас <b>"+str(ntime.hour)+":"+str(ntime.minute)+":"+str(ntime.second)+" "+str(ntime.day)+"."+str(ntime.month)+"."+str(ntime.year)+"</b>", parse_mode='html')
	elif 'Просканируй QR код 💻' == message.text:
		Msg = bot.send_message(message.chat.id, "<b>Отправьте QR код или фотографию с ним</b>", parse_mode='html')
		bot.register_next_step_handler(Msg, scanQRC)
	elif 'Давай поговорим' == message.text:
		Msg = cityAsk = bot.send_message(message.chat.id, "<b>Вы вошли в режим общения. Если вам надоело, то напишите \"Хватит\"</b>", parse_mode='html')
		bot.register_next_step_handler(Msg, speaking)
	elif 'Предложить идею для новой функции ✉️' == message.text:
		Msg = bot.send_message(message.chat.id, "Если у вас есть идея для добавления новой фукции или улучшения бота, то вы можете написать письмо с предложением автору (Для отмены напишите \"отмена\")")
		bot.register_next_step_handler(Msg, sendLetter)

# Функия генерации QR кода
def genQRC(message):
	rcfn = ''
	for i in range(random.randint(7,10)):
		rcfn += random.choice(charsForRandGen)
	qr = qrcode.make(message.text)
	ntime = datetime.datetime.now()
	qrSaveAs = str(ntime.hour)+":"+str(ntime.minute)+":"+str(ntime.second)+"-"+rcfn+"_twGenQRC.jpg"
	qr.save(qrSaveAs)
	with open(qrSaveAs, "rb") as img:
			bot.send_photo(message.chat.id, img)
	time.sleep(1)
	os.system("shred -n 36 -u -z "+qrSaveAs)

# Функция поиска в Википедии
def wikiSearch(message):
	rndAns = random.randint(1,6)
	if rndAns == 1:
		bot.send_message(message.chat.id, "Подождите...")
	elif rndAns == 2:
		bot.send_message(message.chat.id, "Секунду...")
	elif rndAns == 3:
		bot.send_message(message.chat.id, "Минутку...")
	elif rndAns == 4:
		bot.send_message(message.chat.id, "Подождите, мы пока ищем информацию в глубинах интернета ...")
	elif rndAns == 5:
		bot.send_message(message.chat.id, "Пожалуйста подождите...")
	elif rndAns == 6:
		bot.send_message(message.chat.id, "Немного терпения, и всё будет найдено...")
	wikiOutMsg = getWiki(message.text.lower())
	if wikiOutMsg == '1':
		rndAns = random.randint(1,6)
		if rndAns == 1:
			bot.send_message(message.chat.id, "<b>Я не могу найти этого</b>", parse_mode='html')
		elif rndAns == 2:
			bot.send_message(message.chat.id, "<b>Я не знаю этого</b>", parse_mode='html')
		elif rndAns == 3:
			bot.send_message(message.chat.id, "<b>Я не нашёл ответа на этот вопрос</b>", parse_mode='html')
		elif rndAns == 4:
			bot.send_message(message.chat.id, "<b>Я не знаю ответа на этот вопрос</b>", parse_mode='html')
		elif rndAns == 5:
			bot.send_message(message.chat.id, "<b>Результаты не найдены</b>", parse_mode='html')
		elif rndAns == 6:
			bot.send_message(message.chat.id, "<b>Результатов на ваш запрос нету</b>", parse_mode='html')
	elif wikiOutMsg == '2':
		ntime = datetime.datetime.now()
		print(" [ERROR / LOGS ("+str(ntime.hour)+":"+str(ntime.minute)+":"+str(ntime.second)+")] > Неизвестная ошибка в модуле \"wikipedia\"")
		bot.send_message(message.chat.id, "<b>Произошла неизвестная ошибка</b>", parse_mode='html')
	else:
		bot.send_message(message.chat.id, wikiOutMsg)

# Функция парсинга погоды
def weather(message):
	try:
		weatherPlace = message.text.title()
		observation = mgr.weather_at_place(weatherPlace)
		w = observation.weather
		temp = w.temperature('celsius')['temp']
		clouds = w.clouds
		getStatus = w.status
		wind = w.wind()['speed']
		if 'Clouds' == getStatus:
			if clouds >= 97:
				status = 'Туман'
			elif clouds >= 70:
				status = 'Пасмурно'
			elif clouds >= 50:
				status = 'Облачно'
		elif 'Clear' == getStatus:
			status = 'Ясно'
		elif 'Snow' == getStatus:
			status = 'Снег'
		elif 'Rain' == getStatus:
			status = 'Дождь'
		elif 'Thunder' == getStatus:
			status = 'Гроза'
		else:
			status = getStatus

		bot.send_message(message.chat.id, "В городе или крае <b>"+weatherPlace+"</b> сейчас <b>"+status+"</b> и температура "+str(temp)+" °C\nОблачность "+str(clouds)+"%\nСкорость ветра "+str(wind)+" м/с", parse_mode='html')
	except:
		for q in range(random.randint(1,9)):
			rndAns = random.randint(1,4)
		if rndAns == 1:
			bot.send_message(message.chat.id, "<b>Извините, но город не был найден</b>", parse_mode='html')
		elif rndAns == 2:
			bot.send_message(message.chat.id, "<b>Город не найден</b>", parse_mode='html')
		elif rndAns == 3:
			bot.send_message(message.chat.id, "<b>Я не знаю такого города</b>", parse_mode='html')
		elif rndAns == 4:
			bot.send_message(message.chat.id, "<b>Такого города не существует!</b>", parse_mode='html')

# Функция отправки письма
def sendLetter(message):
	if message.text.lower() == 'отмена':
		bot.send_message(message.chat.id, "<b>Вы отменили действие</b>", parse_mode='html')
	else:
		requests.post("https://api.telegram.org/bot"+LETTER_BOT_TOKEN+"/sendMessage?chat_id="+CHAT_ID+"&text="+message.text+" (От "+str(message.from_user.first_name)+", "+str(message.from_user.username)+")")
		bot.send_message(message.chat.id, "<b>Письмо отправлено! Спасибо за поддержку!</b>", parse_mode='html')

# (Функция в разработке)
def speaking(message):
	if 'хватит' == message.text.lower() or 'стоп' == message.text.lower() or 'прекрати' == message.text.lower():
		quitFromSpeakMode = bot.send_message(message.chat.id, "<b>Вы вышли из режима общения</b>", parse_mode='html')
		bot.register_next_step_handler(quitFromSpeakMode, commands)
	elif 'как дела' in message.text.lower() or 'как настроение' in message.text.lower():
		rndAns = random.randint(1,2)
		if rndAns == 1:
			speak = bot.send_message(message.chat.id, "Отлично")
		elif rndAns == 2:
			speak = bot.send_message(message.chat.id, "Хорошо")
		bot.register_next_step_handler(speak, speaking)
	elif 'привет' in message.text.lower() or 'здарова' in message.text.lower() or 'шалом' in message.text.lower() or 'добрый день' in message.text.lower() or 'добрый вечер' in message.text.lower() or 'доброе утро' in message.text.lower() or 'доброй ночи' in message.text.lower() or 'здрасте' in message.text.lower(): 
		speak = bot.send_message(message.chat.id, helloMsg())
		bot.register_next_step_handler(speak, speaking)
	elif 'ты кто' in message.text.lower() or 'кто ты' in message.text.lower():
		speak = bot.send_message(message.chat.id, "Я Телеграм бот "+NAME+" версии "+VER)
		bot.register_next_step_handler(speak, speaking)

# Функция сканирования QR кода
@bot.message_handler(content_types=['photo'])
def scanQRC(message):
	try:
		image = bot.get_file(message.photo[-1].file_id)
		loadImage = bot.download_file(image.file_path)

		ntime = datetime.datetime.now()
		rcfn = ''
		for i in range(random.randint(7,10)):
			rcfn += random.choice(charsForRandGen)

		imageName = str(ntime.hour)+":"+str(ntime.minute)+":"+str(ntime.second)+"-"+rcfn+"_twLoadedQRC.jpg"

		with open(imageName, "wb") as imageSave:
			imageSave.write(loadImage)
			imageSave.close()

		qr = cv2.imread(imageName)
		detector = cv2.QRCodeDetector()

		qrData = detector.detectAndDecode(qr)[0]

		if qrData == '' or qrData == None:
			bot.send_message(message.chat.id, "<b>Не удалось распознать QR код</b>", parse_mode='html')
			time.sleep(1)
			os.system("shred -n 36 -u -z "+imageName)
		else:
			bot.send_message(message.chat.id, "Результат: "+qrData)
			time.sleep(1)
			os.system("shred -n 36 -u -z "+imageName)
	except:
		bot.send_message(message.chat.id, "<b>Ошибка</b>", parse_mode='html')

# Запуск бота
bot.polling(none_stop=True, interval=0)

# Завершение
print("\n < BOT TERMINATED >\n")